This document has been created for exercise and reference purposes. Some plots can be made with qqplot also but I avoided this here to learn ggplot. If you encounter any error or you can give me feedback on how to improve code and analysis, please contact me!

Click here to get to the Homework for week 2 directly

\[ \]

Import packages
library(foreign)
library(ggplot2)
library(GGally)
library(gvlma)
library(reshape2)
library(car)
library(lm.beta)

\[ \]

Import Data
setwd('/Users/henrikeckermann/Documents/workspace/Website/mysite/main/templates/Blok 1/Multivariate Statistics/Week 2/HW2')
data_full <- read.spss('REGRESS.SAV',to.data.frame = T)
re-encoding from CP1252
data <- data_full
data$rn <- rownames(data)
write.csv(data_full, file = 'REGRESSION.csv')

\[ \]

Data overview:
head(data)
str(data)
'data.frame':   465 obs. of  6 variables:
 $ id     : num  1 2 3 4 5 6 7 8 9 10 ...
 $ timedrs: num  1 3 0 13 15 3 2 0 7 4 ...
 $ phyheal: num  5 4 3 2 3 5 5 4 5 3 ...
 $ menheal: num  8 6 4 2 6 5 6 5 4 9 ...
 $ stress : num  265 415 92 241 86 247 13 12 269 391 ...
 $ rn     : chr  "1" "2" "3" "4" ...
 - attr(*, "variable.labels")= Named chr  "Participant number" "Visits to health professionals" "Physical health symptoms" "Mental health symptoms" ...
  ..- attr(*, "names")= chr  "id" "timedrs" "phyheal" "menheal" ...
 - attr(*, "codepage")= int 1252
ggpairs(data[,1:4], aes(alpha=0.1),lower = list(continuous = "smooth"))

 plot: [1,1] [===========-----------------------------------------------------------------------------------------------------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [======================------------------------------------------------------------------------------------------------------------------------------------------------------] 12% est: 1s 
 plot: [1,3] [================================--------------------------------------------------------------------------------------------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [===========================================---------------------------------------------------------------------------------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================================================----------------------------------------------------------------------------------------------------------------------] 31% est: 1s 
 plot: [2,2] [================================================================------------------------------------------------------------------------------------------------------------] 38% est: 1s 
 plot: [2,3] [===========================================================================-------------------------------------------------------------------------------------------------] 44% est: 1s 
 plot: [2,4] [======================================================================================--------------------------------------------------------------------------------------] 50% est: 1s 
 plot: [3,1] [=================================================================================================---------------------------------------------------------------------------] 56% est: 1s 
 plot: [3,2] [============================================================================================================----------------------------------------------------------------] 62% est: 0s 
 plot: [3,3] [======================================================================================================================------------------------------------------------------] 69% est: 0s 
 plot: [3,4] [=================================================================================================================================-------------------------------------------] 75% est: 0s 
 plot: [4,1] [============================================================================================================================================--------------------------------] 81% est: 0s 
 plot: [4,2] [======================================================================================================================================================----------------------] 88% est: 0s 
 plot: [4,3] [=================================================================================================================================================================-----------] 94% est: 0s 
 plot: [4,4] [============================================================================================================================================================================]100% est: 0s 
                                                                                                                                                                                                        

\[ \]

6 Potential Problems:

1. The relationship between the response variable (Y) and the predictors \(X_i\) is not linear.
Inspect single \(X_i\) vs residuals if possible. Always inspect the fitted values vs the vs sesiduals. Residuals should be randomly distributed. 2. Heteroscedasticity: Non-constant variance across the range of residuals for each predictor.
Look at the residuals. Heteroscedasticity shows when the SD of the redisuals increases with increasing Y resulting in a ‘funnel like appearance’.
3. Residuals not normally distributed
Easy to inspect visually when plotting the residuals. They should be somewhat centered around a horizontal line and symmetrically spread around that line. Use QQ-plot also. 4. Independence of the Errors
Imagine the distance how far subjects live away from a toxic substance that influences the measured variables differs between subjects. In that cases the error depends on that distance. Durbin-Watson statistic is a measure of independence of the error and should lie between 1-3, optimally at 2. For time-series data (or with the distance example): Plot errors as a function of time (distance) and look for patterns. Generally, indepence of error is achieved by a solid experimental design. 5. Absence of Multicollinearity:
There may not be a high correlation between the predictors. Use Variance inflation factor as shown below. 6. Multivariate Outliers

  • An observation that is unconditionally unusual in either its Y or X value is called a univariate outlier, but it is not necessarily a regression outlier
  • A regression outlier is an observation that has an unusual value of the dependent variable Y, conditional on its value of the independent variable X (Discrepancy: ). In other words, for a regression outlier, neither the X nor the Y value is necessarily unusual on its own. It will have a large residual but not necessarily affect the regression slope coefficient much. (Note: If it does have high leverage, then it drags the line towards it, resulting in a smaller residual. Studentized residuals correct for leverage and then uncover the disdcrepancy of that point)
  • Leverage: An observation that has unusual X value (far away from the mean of X) has higher leverage with increasing distance from the mean. But that does not necessarily mean it has also high influence on the regression line as it might perfectly fit to the line that the rest of the data would produce anyway.
  • Even though outliers may have not a high influence, they can cause other problems such as increase in RSE (which is used for calculating confidence interval and p-values).
  • Influence = Leverage x Discrepancy
  • Cook’s D is a measure of how much the model changes if a certain value is removed. This helps identify values that have a high influence on the model
  • No more than 5%/1% of the standardized residuals should be > 2/2.5 or <-2/-2.5 according to some authors
  • In this document I will handle it this way: Studentized Residuals with a SD > 3 or < -3 are possible outliers.

Assumptions that are not covered:
a) All predictors that are reasonable based on previous research or the theory are integrated into the model (not further tested or explained here)
b) The reliability of the measures should be 1 (reasonable cutoff is 0.7). This is not covered here.

\[ \]

1. Linearity

Bivariate plots
ggplot(data, aes(x = phyheal , y = timedrs)) +
  geom_point(alpha = 0.4) +
  geom_smooth(aes(col = 'red'), method = 'lm', alpha = 0.4) +
  geom_smooth(aes(col = 'skyblue'))

ggplot(data, aes(x = menheal , y = timedrs)) +
  geom_point(alpha = 0.4) +
  geom_smooth(aes(col = 'red'), method = 'lm', alpha = 0.4) +
  geom_smooth(aes(col = 'skyblue'))

ggplot(data, aes(x = stress , y = timedrs)) +
  geom_point(alpha = 0.4) +
  geom_smooth(aes(col = 'red'), method = 'lm', alpha = 0.4) +
  geom_smooth(aes(col = 'skyblue'))

\[ \]

Fit linear model:
fit <- lm(timedrs ~ phyheal + menheal + stress, data)
data$residuals <- resid(fit)
data$residuals.standard <- rstandard(fit)
data$residuals.studentized <- rstudent(fit)
data$fitted <- fitted.values(fit)
summary(fit)

Call:
lm(formula = timedrs ~ phyheal + menheal + stress, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-14.792  -4.353  -1.815   0.902  65.886 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.704848   1.124195  -3.296 0.001058 ** 
phyheal      1.786948   0.221074   8.083  5.6e-15 ***
menheal     -0.009666   0.129029  -0.075 0.940318    
stress       0.013615   0.003612   3.769 0.000185 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.708 on 461 degrees of freedom
Multiple R-squared:  0.2188,    Adjusted R-squared:  0.2137 
F-statistic: 43.03 on 3 and 461 DF,  p-value: < 2.2e-16
\(X_i\) vs Standardized Residual

We should see randomly distributed datapoints in these plots:

ggplot(data, aes(x=phyheal, y=residuals.standard)) +
  geom_point(alpha=0.4) +
  geom_smooth()

ggplot(data, aes(x=stress, y=residuals.standard)) +
  geom_point(alpha=0.4) +
  geom_smooth()

ggplot(data, aes(x=menheal, y=residuals.standard)) +
  geom_point(alpha=0.4) +
  geom_smooth()

Fitted vs actual values:
ggplot(data, aes(x=fitted, y=timedrs)) +
  geom_point(alpha=0.4) +
  geom_smooth(se=F, color='green') +
  geom_smooth(method='lm', color='red')

ggplot(data, aes(x=fitted, y=residuals)) +
  geom_point(alpha=0.4) +
  geom_smooth(se=F, color='green') +
  geom_smooth(method='lm', color='red')

\[ \]

2. Normally distributed residuals, Linearity of residuals and Homoscedasticity

We check these assumptions by inspecting 3 graphs.

  • This histogram of the residuals should look normally distributed but we see clear deviation here:
data$fitted <- fit$fitted.values
p.hs3 <- ggplot(data, aes(x = residuals.standard)) +
  geom_histogram(aes(y = ..density..), color = 'black', fill = 'white') +
  labs(x = 'Standardized Residuals', y = 'Density') +
  stat_function(fun = dnorm, args = list(mean = mean(data$residuals.standard), sd = sd(data$residuals.standard)), color = 'red', size = 1)
p.hs3

  • Again this graph should indicate normally ditributed residuals but there is clear deviation:
p.hs2 <- ggplot(data, aes(sample = residuals.standard)) +
  stat_qq()
p.hs2

  • This graph should look as if dots are totally randomly distributed but it looks like there is some heteroscedasticity as the dots are very concentrated near the fitted line in the left and then they spread leading to the typical funnel-look (typical for heteroscedasticity):
p.hs <- ggplot(data, aes(x = fitted, y= residuals.standard)) +
  geom_point(alpha = 0.4, color = 'red') +
  geom_smooth(method = 'lm', color = 'black') +
  geom_smooth(color = 'yellow', se = F) +
  labs(x = 'Fitted Values', y = 'Standardized Residual')
p.hs

\[ \]

3. Independece of Errors

Conservative rule for the DWT-test: Values shoud be between >1 and <3 and the closer to 2, the better.

durbinWatsonTest(fit)
 lag Autocorrelation D-W Statistic p-value
   1    -0.004467856      2.007136   0.998
 Alternative hypothesis: rho != 0

\[ \]

4. Multicollinearity

  • If the largest VIF is greater than 10 then there is cause for concern (Bowerman & O’Connell, 1990; Myers, 1990).
  • If the average VIF is substantially greater than 1 then the regression may be biased (Bowerman & O’Connell, 1990).
  • Tolerance below 0.1 indicates a serious problem.
  • Tolerance below 0.2 indicates a potential problem (Menard, 1995).
vif(fit)
 phyheal  menheal   stress 
1.372358 1.441328 1.184410 
1/vif(fit)
  phyheal   menheal    stress 
0.7286726 0.6938048 0.8443025 
mean(vif(fit))
[1] 1.332699

\[ \]

6. Multivariate Outliers

Here we see the standardized or studentized residuals plotted against the leverage. 14 data points are multivariate outliers. 3 of them have also more than 2x the average leverage. There is one point that has relatively high leverage and high deviation, which potentially has a high influence on our model. Generally, 3.7% are more than 2.5SD away, which indicates a poor fit of the model.

mean(data$residuals.standard > 2 | data$residuals.standard < -2) # are 95% within +/- 2?
[1] 0.04516129
mean(data$residuals.standard > 2.5 | data$residuals.standard < -2.5) # are 99% within +/- 2.5?
[1] 0.03655914
data$cooks.distance <- cooks.distance(fit)
data$leverage <- hatvalues(fit)
influence <- data[(data$cooks.distance>0.05 & data$leverage > 2*mean(data$leverage)),]
p.o <- ggplot(data, aes(x = leverage, y = residuals.standard)) +
  geom_hline(yintercept = 3, linetype = 'dotted',alpha=0.4) +
  geom_hline(yintercept = 2, linetype = 'dotted', alpha=0.4) +
  geom_vline(xintercept = 2* mean(data$leverage), linetype = 'dotted',alpha=0.4) +
  geom_point(alpha = 0.2) +
  geom_point(data = influence, aes(x = leverage, y = residuals.standard), color = 'red') +
  geom_text(data = influence, aes(label =rn), vjust = 2)
p.o.rst <- ggplot(data, aes(x = leverage, y = residuals.studentized)) +
  geom_hline(yintercept = 3, linetype = 'dotted',alpha=0.4) +
  geom_hline(yintercept = 2, linetype = 'dotted', alpha=0.4) +
  geom_vline(xintercept = 2* mean(data$leverage), linetype = 'dotted',alpha=0.4) +
  geom_point(alpha = 0.2) +
  geom_point(data = influence, aes(x = leverage, y = residuals.studentized), color = 'red') +
  geom_text(data = influence, aes(label =rn), vjust = 2)
p.o

p.o.rst

\[ \]

How to make a quick analysis:

plot(fit)

gvlma(fit)

Call:
lm(formula = timedrs ~ phyheal + menheal + stress, data = data)

Coefficients:
(Intercept)      phyheal      menheal       stress  
  -3.704848     1.786948    -0.009666     0.013615  


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = fit) 

                       Value p-value                   Decision
Global Stat        4901.2493  0.0000 Assumptions NOT satisfied!
Skewness            862.7720  0.0000 Assumptions NOT satisfied!
Kurtosis           4036.5033  0.0000 Assumptions NOT satisfied!
Link Function         0.9991  0.3175    Assumptions acceptable.
Heteroscedasticity    0.9749  0.3235    Assumptions acceptable.

Log transform the dependent variable:

data$timedrs.log <- log((data$timedrs+1))
  1. Normality The deviation from the normal distribution (of the DV) has somewhat improved:
ggplot(data, aes(x=timedrs.log)) +
  geom_histogram(aes(y = ..density..), col = 'black', fill = 'white') + 
  stat_function(fun = dnorm, color = 'red', args = list(mean(data$timedrs.log), sd = sd(data$timedrs.log)), size = 1)

ggplot(data, aes(sample = timedrs.log)) + 
  stat_qq()

But according to the Shapiro-Wilk test, the percentage on the logtransformed variable timedrs, W = 0.637, p < .001, is still significantly non-normal.

shapiro.test(data$timedrs.log)

    Shapiro-Wilk normality test

data:  data$timedrs.log
W = 0.97608, p-value = 6.492e-07
  1. Linearity It looks as if the reationship is roughly linear:
ggplot(data, aes(x = phyheal , y = timedrs.log)) +
  geom_point(alpha = 0.4) +
  geom_smooth(col = 'red', method = 'lm', alpha = 0.4, se = F) +
  geom_smooth(col = 'skyblue')

ggplot(data, aes(x = menheal , y = timedrs.log)) +
  geom_point(alpha = 0.4) +
  geom_smooth(col = 'red', method = 'lm', alpha = 0.4, se = F) +
  geom_smooth(col = 'skyblue')

ggplot(data, aes(x = stress , y = timedrs.log)) +
  geom_point(alpha = 0.4) +
  geom_smooth(col = 'red', method = 'lm', alpha = 0.4) +
  geom_smooth(col = 'skyblue')

  1. Multivariate Outliers The percentage of outliers indicates that our model fit is not sufficient.
data$log.leverage <- hatvalues(fit.log)
data$log.residuals.standard <- rstandard(fit.log)
data$log.residuals <- resid(fit.log)
data$log.cooks.distance <- cooks.distance(fit.log)
data$log.residuals.studentized <- rstudent(fit.log)
mean(data$log.residuals.standard > 2 | data$log.residuals.standard < -2) # are 95% within +/- 2?
[1] 0.06451613
mean(data$log.residuals.standard > 2.5 | data$log.residuals.standard < -2.5) # are 99% within +/- 2.5?
[1] 0.02580645

There remains one multivariate outlier with low leverage. The most influental data point according to Cook’s D has a Cook’s D lower than 0.08 and is therefore not considered problemtatic.

fara <- data[data$log.residuals.standard>=3,]
log.influence <- data[(data$log.cooks.distance>0.07 & data$log.leverage > 2*mean(data$log.leverage)),]
p.log.o <- ggplot(data, aes(x = log.leverage, y = log.residuals.studentized)) +
  geom_hline(yintercept = 3, linetype = 'dotted') +
  geom_hline(yintercept = 2, linetype = 'dotted') +
  geom_hline(yintercept = -2, linetype = 'dotted') +
  geom_vline(xintercept = 2* mean(data$leverage), linetype = 'dotted') +
  geom_point(alpha = 0.2) +
  geom_point(data = log.influence, aes(x = log.leverage, y = log.residuals.studentized), color = 'red') +
  geom_text(data = log.influence, aes(label =rn), vjust = 2)+
  geom_text(data = fara, aes(label =rn), hjust = 1.2)
p.log.o

  1. Independece of Errors Conservative rule: Values shoud be >1 and <3 and the closer to 2, the better.
durbinWatsonTest(fit.log)
 lag Autocorrelation D-W Statistic p-value
   1     -0.03493742      2.065067   0.446
 Alternative hypothesis: rho != 0
  1. Multicollinearity
  • If the largest VIF is greater than 10 then there is cause for concern (Bowerman & O’Connell, 1990; Myers, 1990).
  • If the average VIF is substantially greater than 1 then the regression may be biased (Bowerman & O’Connell, 1990).
  • Tolerance below 0.1 indicates a serious problem.
  • Tolerance below 0.2 indicates a potential problem (Menard, 1995).
vif(fit.log)
 phyheal  menheal   stress 
1.372358 1.441328 1.184410 
1/vif(fit.log)
  phyheal   menheal    stress 
0.7286726 0.6938048 0.8443025 
mean(vif(fit.log))
[1] 1.332699
  1. Homoscedasticity, Normally distributed residuals and Linearity We check this assumptions again by inspecting 3 graphs.
  • This histogram of standardized residuals should look like a normal distribution and it is definitively improved and looks normally distributed:
data$log.fitted <- fit.log$fitted.values
p.log.hs3 <- ggplot(data, aes(x = log.residuals.standard)) +
  geom_histogram(aes(y = ..density..), color = 'black', fill = 'white') +
  labs(x = 'Log Standardized Residual', y = 'Density') +
  stat_function(fun = dnorm, args = list(mean = mean(data$log.residuals.studentized), sd = sd(data$log.residuals.studentized)), color = 'red', size = 1)
p.log.hs3

  • Again this graph should indicate normally ditributed residuals, which it does:
p.log.hs2 <- ggplot(data, aes(sample = log.residuals.standard)) +
  stat_qq()
p.log.hs2

  • This graph should look as if dots are normally randomly distributed around the horizontal line. The LOESS fit should not show a strong curve. The plot distribution of residuals clearly imporved with regard to our assumptions.
p.log.hs <- ggplot(data, aes(x = fitted, y= log.residuals.standard)) +
  geom_point(alpha = 0.4, color = 'red') +
  geom_smooth(method = 'lm', color = 'black') +
  geom_smooth(color = 'yellow', se = F) +
  labs(x = 'Fitted Values', y = 'Log Standardized Residual')
p.log.hs

Perform regression analysis for optional question:
data$sstress <- sqrt(data$stress)
data$lphyheal <- log(data$phyheal)
data$smenheal <- sqrt(data$menheal)
fit.trans <- lm(timedrs.log ~ lphyheal + smenheal + sstress, data)
data$tleverage <- hatvalues(fit.trans)
data$tcook <- cooks.distance(fit.trans)
data$tstresid <- rstandard(fit.trans)
data$tfitted <- fit.trans$fitted.values
tinfluence <- data[(data$tcook >0.05 & data$tleverage > 2*mean(data$tleverage)),]
tfara <- data[data$tstresid>=3,]
p.trans <- ggplot(data, aes(x = tfitted, y= tstresid)) +
  geom_point(alpha = 0.4, color = 'red') +
  geom_smooth(method = 'lm', color = 'black') +
  geom_smooth(color = 'yellow', se = F) +
  labs(x = 'Fitted Values', y = 'Transformed - Standardized Residual')
p.trans.two <- ggplot(data, aes(x = tleverage, y = tstresid)) +
  geom_hline(yintercept = 3, linetype = 'dotted') +
  geom_hline(yintercept = 2, linetype = 'dotted') +
  geom_hline(yintercept = -2, linetype = 'dotted') +
  geom_vline(xintercept = 2* mean(data$tleverage), linetype = 'dotted') +
  geom_point(alpha = 0.2) +
  geom_point(data = tinfluence, aes(x = tleverage, y = tstresid), color = 'red') +
  geom_text(data = tinfluence, aes(label =rn), vjust = 2)+
  geom_text(data = tfara, aes(label = rn), hjust = 1.2)
#Independence of Error
durbinWatsonTest(fit.trans)
 lag Autocorrelation D-W Statistic p-value
   1     -0.03398472      2.061504   0.494
 Alternative hypothesis: rho != 0
#Multicollinearity
vif(fit.trans)
lphyheal smenheal  sstress 
1.376151 1.447262 1.198400 
1/vif(fit.trans)
 lphyheal  smenheal   sstress 
0.7266644 0.6909599 0.8344462 
mean(vif(fit.trans))
[1] 1.340604
# Outlier
mean(data$tstresid > 2 | data$tstresid < -2) # are 95% within +/- 2?
[1] 0.07096774
mean(data$tstresid > 2.5 | data$tstresid < -2.5) # are 99% within +/- 2.5?
[1] 0.02580645
p.trans

p.trans.two

\(\newpage\)

Homework

Part A

1. Does the analysis violate any statistical assumptions? Why or why not?

The studentized and standardized residuals look not evenly and symmetrically distributed.

p.hs3

The QQ-plot confirms a clear deviation from normality of the standardized residuals, thus violating the assumption of normally distributed residuals.

p.hs2

Finally, the fitted values plotted against the standardized residuals should show randomly normal distributed dots around the horizontal line. But in the plot many dots are concentrated on the left near the line, are not symmetric and the standard deviation increases across the x-axis clearly indicating heteroscedasticity. Thus, the assumption of Homoscedasticity is violated, too.

p.hs

2. Does this analysis violate any statistical assumptions?
There are no violations anymore.

3. Do the residuals look normal, linear, and homoscedastic? Why or why not? That is, describe what features of the scatterplot between the predicted and residual values indicate each assumption is either met or violated.
The residuals look normal because the QQ-Plot shows a line with no major deviations and the distribution shown by the histogram also looks normal.

p.log.hs3

p.log.hs2

The residuals also look symmetrically distributed around the horizontal line (indicating normal distribution). Violating normal distribution would mean the dots being non-symmetrically distributed or the dots being more concetrated further away from the horizontal line. There is only a mild curverlinear trend, thus the assumption of linearity is not violated. The datapoints are relatively evenly and randomly spread indicating homoscedasticity. Heteroscedasticity would be obvious by an increasing standard deviation across the x-axis leading to the typical ‘funnel look’.

p.log.hs

4. How many multivariate outliers are there?
There is one outlier (id 479, rownumber 345) if the criterium is +/- 3 SD of the residuals. But it has not as much influence as the observation with id 405 according to the Cook’s distance. But this observation still has no critical value. However, 6.45%/2.6% of the data are more than 2 SD/2.5 SD spread away fromt the mean indicating a poor fit.

p.log.o

OPTIONAL: Perform another regression analysis, but this time use the transformed measures of all variables. Does the inclusion of transformed predictors further reduce violations of model assumptions?

There remains one multivariate outlier (345), which still has not the highest influence (and no other observations have too high influence). But the percentage of standardized residuals > +/-2 increased to ~7% indicating a poor fit of the linear model. Assumptions of Normality, Linearity and Homoscedasticity are not violated. See plots for visual summary:

p.trans

p.trans.two

Part B: Perform analyses and report the results

Use the results of the regression that included the transformed score of TIMEDRS to answer the following questions:

5. What is the best predictor of TIMEDRS (i.e., largest beta)?

As seen in the output: PHYHEAL is the best predictor.

fit.log.beta <- lm.beta(fit.log)
summary(fit.log.beta)

Call:
lm(formula = timedrs.log ~ phyheal + menheal + stress, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.95865 -0.44076 -0.02331  0.42304  2.36797 

Coefficients:
             Estimate Standardized Std. Error t value Pr(>|t|)    
(Intercept) 0.3903862    0.0000000  0.0882908   4.422 1.22e-05 ***
phyheal     0.2019361    0.5043975  0.0173624  11.631  < 2e-16 ***
menheal     0.0071442    0.0313336  0.0101335   0.705    0.481    
stress      0.0013158    0.1868692  0.0002837   4.638 4.58e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7625 on 461 degrees of freedom
Multiple R-squared:  0.3682,    Adjusted R-squared:  0.3641 
F-statistic: 89.56 on 3 and 461 DF,  p-value: < 2.2e-16

6. How much of the variance of TIMEDRS is explained by the three predictors?

\(R^2 = 0.3682\)

7. Complete the table below. Be sure to include all values in the table and in the table note (i.e., the n and R2).

b SE \(\beta\) p-value
Stressful life events 0.001 0.0002 0.187 < 0.001
Mental health problems 0.007 0.0101 0.031 < 0.481
Physical health problems 0.202 0.017 0.504 < 0.001

Note: n = 465, Adjusted \(R^2\) = 0.36

8. What is the value of the intercept?

0.3904

9. Describe the results of this regression analysis in APA style. Be sure to describe the analysis, the amount of explained variance, and the magnitude and direction of statistically significant associations.

B SE B \(\beta\) P
Constant 0.39 0.09 < 0.001
Stressful life events \(0.001^{***}\) < 0.001 0.187 < 0.001
Mental health problems 0.007 0.01 0.031 < 0.481
Physical health problems \(0.20^{***}\) 0.02 0.504 < 0.001

Note: n = 465, Adjusted \(R^2\) = 0.36

Part C: Differences between types of regression analyses

There are three types of linear (and logistic) regression: Standard regression (which is performed in SPSS by default) consists of all predictors being simultaneously entered (i.e., in a single block).

Hierarchical regression consists of predictors being entered in different blocks to determine the unique contributions of variables of interest (i.e., change in R-square). Statistical regression involves different method for entering and removing predictors that improve the predictive value of the regression analysis. That is, SPSS decides which predictors to include and exclude from the regression model. Statistical regression is performed just like standard multiple regression, except that the METHOD is different. For statistical regression, the methods are FORWARD, BACKWARD, and STEPWISE (for standard regression the method is ENTER).

10. Standard regression has been used and reported thus far. Describe situations when hierarchical and statistical regression would be more appropriate than using a standard regression.

This depends on the research question. Hierarchical regression would be more appropriate to answer the question: Does (e.g.) \(X_1\) significantly add to prediction of Y after differences among subjects in \(X_2\) and \(X_3\) have been statistically eliminated?
Statistical regression would be more appropriate to answer: What is the best linear combination of IVs to predict the DV in this sample?

LS0tCnRpdGxlOiAiTGluZWFyIFJlZ3Jlc3Npb24iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKX1RoaXMgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgZXhlcmNpc2UgYW5kIHJlZmVyZW5jZSBwdXJwb3Nlcy4gU29tZSBwbG90cyBjYW4gYmUgbWFkZSB3aXRoIHFxcGxvdCBhbHNvIGJ1dCBJIGF2b2lkZWQgdGhpcyBoZXJlIHRvIGxlYXJuIGdncGxvdC4gSWYgeW91IGVuY291bnRlciBhbnkgZXJyb3Igb3IgeW91IGNhbiBnaXZlIG1lIGZlZWRiYWNrIG9uIGhvdyB0byBpbXByb3ZlIGNvZGUgYW5kIGFuYWx5c2lzLCBwbGVhc2UgY29udGFjdCBtZSFfCgoKIyBbQ2xpY2sgaGVyZSB0byBnZXQgdG8gdGhlIEhvbWV3b3JrIGZvciB3ZWVrIDIgZGlyZWN0bHldW0hvbWV3b3JrXQoKCgogIAokJAokJAogIAojIyMjIyMgSW1wb3J0IHBhY2thZ2VzCmBgYHtyfQpsaWJyYXJ5KGZvcmVpZ24pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShHR2FsbHkpCmxpYnJhcnkoZ3ZsbWEpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGxtLmJldGEpCmBgYAoKICAKJCQKJCQKICAKCiMjIyMjIyBJbXBvcnQgRGF0YQpgYGB7cn0Kc2V0d2QoJy9Vc2Vycy9oZW5yaWtlY2tlcm1hbm4vRG9jdW1lbnRzL3dvcmtzcGFjZS9XZWJzaXRlL215c2l0ZS9tYWluL3RlbXBsYXRlcy9CbG9rIDEvTXVsdGl2YXJpYXRlIFN0YXRpc3RpY3MvV2VlayAyL0hXMicpCmRhdGFfZnVsbCA8LSByZWFkLnNwc3MoJ1JFR1JFU1MuU0FWJyx0by5kYXRhLmZyYW1lID0gVCkKZGF0YSA8LSBkYXRhX2Z1bGwKZGF0YSRybiA8LSByb3duYW1lcyhkYXRhKQp3cml0ZS5jc3YoZGF0YV9mdWxsLCBmaWxlID0gJ1JFR1JFU1NJT04uY3N2JykKYGBgCgoKICAKJCQKJCQKICAKCiMjIyMjIyBEYXRhIG92ZXJ2aWV3OgpgYGB7cn0KaGVhZChkYXRhKQpzdHIoZGF0YSkKZ2dwYWlycyhkYXRhWywxOjRdLCBhZXMoYWxwaGE9MC4xKSxsb3dlciA9IGxpc3QoY29udGludW91cyA9ICJzbW9vdGgiKSkKYGBgCgogIAokJAokJAogIAoKIyMgNiBQb3RlbnRpYWwgUHJvYmxlbXM6CioqMS4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByZXNwb25zZSB2YXJpYWJsZSAoWSkgYW5kIHRoZSBwcmVkaWN0b3JzICRYX2kkIGlzIG5vdCBsaW5lYXIuICoqICAKSW5zcGVjdCBzaW5nbGUgJFhfaSQgdnMgcmVzaWR1YWxzIGlmIHBvc3NpYmxlLiBBbHdheXMgaW5zcGVjdCB0aGUgZml0dGVkIHZhbHVlcyB2cyB0aGUgdnMgc2VzaWR1YWxzLiBSZXNpZHVhbHMgc2hvdWxkIGJlIHJhbmRvbWx5IGRpc3RyaWJ1dGVkLiAKKioyLiBIZXRlcm9zY2VkYXN0aWNpdHk6IE5vbi1jb25zdGFudCB2YXJpYW5jZSBhY3Jvc3MgdGhlIHJhbmdlIG9mIHJlc2lkdWFscyBmb3IgZWFjaCBwcmVkaWN0b3IuKiogIApMb29rIGF0IHRoZSByZXNpZHVhbHMuIEhldGVyb3NjZWRhc3RpY2l0eSBzaG93cyB3aGVuIHRoZSBTRCBvZiB0aGUgcmVkaXN1YWxzIGluY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgWSByZXN1bHRpbmcgaW4gYSAnZnVubmVsIGxpa2UgYXBwZWFyYW5jZScuICAKKiozLiBSZXNpZHVhbHMgIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZCoqICAKRWFzeSB0byBpbnNwZWN0IHZpc3VhbGx5IHdoZW4gcGxvdHRpbmcgdGhlIHJlc2lkdWFscy4gVGhleSBzaG91bGQgYmUgc29tZXdoYXQgY2VudGVyZWQgYXJvdW5kIGEgaG9yaXpvbnRhbCBsaW5lIGFuZCBzeW1tZXRyaWNhbGx5IHNwcmVhZCBhcm91bmQgdGhhdCBsaW5lLiBVc2UgUVEtcGxvdCBhbHNvLgoqKjQuIEluZGVwZW5kZW5jZSBvZiB0aGUgRXJyb3JzKiogIApJbWFnaW5lIHRoZSBkaXN0YW5jZSBob3cgZmFyIHN1YmplY3RzIGxpdmUgYXdheSBmcm9tIGEgdG94aWMgc3Vic3RhbmNlIHRoYXQgaW5mbHVlbmNlcyB0aGUgbWVhc3VyZWQgdmFyaWFibGVzIGRpZmZlcnMgYmV0d2VlbiBzdWJqZWN0cy4gSW4gdGhhdCBjYXNlcyB0aGUgZXJyb3IgZGVwZW5kcyBvbiB0aGF0IGRpc3RhbmNlLiBEdXJiaW4tV2F0c29uIHN0YXRpc3RpYyBpcyBhIG1lYXN1cmUgb2YgaW5kZXBlbmRlbmNlIG9mIHRoZSBlcnJvciBhbmQgc2hvdWxkIGxpZSBiZXR3ZWVuIDEtMywgb3B0aW1hbGx5IGF0IDIuIEZvciB0aW1lLXNlcmllcyBkYXRhIChvciB3aXRoIHRoZSBkaXN0YW5jZSBleGFtcGxlKTogUGxvdCBlcnJvcnMgYXMgYSBmdW5jdGlvbiBvZiB0aW1lIChkaXN0YW5jZSkgYW5kIGxvb2sgZm9yIHBhdHRlcm5zLiBHZW5lcmFsbHksIGluZGVwZW5jZSBvZiBlcnJvciBpcyBhY2hpZXZlZCBieSBhIHNvbGlkIGV4cGVyaW1lbnRhbCBkZXNpZ24uIAoqKjUuIEFic2VuY2Ugb2YgTXVsdGljb2xsaW5lYXJpdHk6KiogIApUaGVyZSBtYXkgbm90IGJlIGEgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwcmVkaWN0b3JzLiBVc2UgVmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvciBhcyBzaG93biBiZWxvdy4KKio2LiBNdWx0aXZhcmlhdGUgT3V0bGllcnMqKiAgCgoqIEFuIG9ic2VydmF0aW9uIHRoYXQgaXMgdW5jb25kaXRpb25hbGx5IHVudXN1YWwgaW4gZWl0aGVyIGl0cyBZIG9yIFggdmFsdWUgaXMgY2FsbGVkIGEgdW5pdmFyaWF0ZSBvdXRsaWVyLCBidXQgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcmVncmVzc2lvbiBvdXRsaWVyCiogQSByZWdyZXNzaW9uIG91dGxpZXIgaXMgYW4gb2JzZXJ2YXRpb24gdGhhdCBoYXMgYW4gdW51c3VhbCB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIFksIGNvbmRpdGlvbmFsIG9uIGl0cyB2YWx1ZSBvZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgWCAoKipEaXNjcmVwYW5jeToqKiApLiBJbiBvdGhlciB3b3JkcywgZm9yIGEgcmVncmVzc2lvbiBvdXRsaWVyLCBuZWl0aGVyIHRoZSBYIG5vciB0aGUgWSB2YWx1ZSBpcyBuZWNlc3NhcmlseSB1bnVzdWFsIG9uIGl0cyBvd24uIEl0IHdpbGwgaGF2ZSBhIGxhcmdlIHJlc2lkdWFsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWZmZWN0IHRoZSByZWdyZXNzaW9uIHNsb3BlIGNvZWZmaWNpZW50IG11Y2guIChOb3RlOiBJZiBpdCBkb2VzIGhhdmUgaGlnaCBsZXZlcmFnZSwgdGhlbiBpdCBkcmFncyB0aGUgbGluZSB0b3dhcmRzIGl0LCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIHJlc2lkdWFsLiBTdHVkZW50aXplZCByZXNpZHVhbHMgY29ycmVjdCBmb3IgbGV2ZXJhZ2UgYW5kIHRoZW4gdW5jb3ZlciB0aGUgZGlzZGNyZXBhbmN5IG9mIHRoYXQgcG9pbnQpCiogKipMZXZlcmFnZToqKiBBbiBvYnNlcnZhdGlvbiB0aGF0IGhhcyB1bnVzdWFsIFggdmFsdWUgKGZhciBhd2F5IGZyb20gdGhlIG1lYW4gb2YgWCkgaGFzIGhpZ2hlciBsZXZlcmFnZSB3aXRoIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbSB0aGUgbWVhbi4gQnV0IHRoYXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiBpdCBoYXMgYWxzbyBoaWdoIGluZmx1ZW5jZSBvbiB0aGUgcmVncmVzc2lvbiBsaW5lIGFzIGl0IG1pZ2h0IHBlcmZlY3RseSBmaXQgdG8gdGhlIGxpbmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZGF0YSB3b3VsZCBwcm9kdWNlIGFueXdheS4KKiBFdmVuIHRob3VnaCBvdXRsaWVycyBtYXkgaGF2ZSBub3QgYSBoaWdoIGluZmx1ZW5jZSwgdGhleSBjYW4gY2F1c2Ugb3RoZXIgcHJvYmxlbXMgc3VjaCBhcyBpbmNyZWFzZSBpbiBSU0UgKHdoaWNoIGlzIHVzZWQgZm9yIGNhbGN1bGF0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWwgYW5kIHAtdmFsdWVzKS4KKiAqKkluZmx1ZW5jZSA9IExldmVyYWdlIHggRGlzY3JlcGFuY3kqKgoqICoqQ29vaydzIEQqKiBpcyBhIG1lYXN1cmUgb2YgaG93IG11Y2ggdGhlIG1vZGVsIGNoYW5nZXMgaWYgYSBjZXJ0YWluIHZhbHVlIGlzIHJlbW92ZWQuIFRoaXMgaGVscHMgaWRlbnRpZnkgdmFsdWVzIHRoYXQgaGF2ZSBhIGhpZ2ggaW5mbHVlbmNlIG9uIHRoZSBtb2RlbCAgCiogTm8gbW9yZSB0aGFuIDUlLzElIG9mIHRoZSBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIHNob3VsZCBiZSA+IDIvMi41IG9yIDwtMi8tMi41IGFjY29yZGluZyB0byBzb21lIGF1dGhvcnMgCiogSW4gdGhpcyBkb2N1bWVudCBJIHdpbGwgaGFuZGxlIGl0IHRoaXMgd2F5OiBTdHVkZW50aXplZCBSZXNpZHVhbHMgd2l0aCBhIFNEID4gMyBvciA8IC0zIGFyZSBwb3NzaWJsZSBvdXRsaWVycy4KCgpBc3N1bXB0aW9ucyB0aGF0IGFyZSBub3QgY292ZXJlZDogIAphKSBBbGwgcHJlZGljdG9ycyB0aGF0IGFyZSByZWFzb25hYmxlIGJhc2VkIG9uIHByZXZpb3VzIHJlc2VhcmNoIG9yIHRoZSB0aGVvcnkgYXJlIGludGVncmF0ZWQgaW50byB0aGUgbW9kZWwgKG5vdCBmdXJ0aGVyIHRlc3RlZCBvciBleHBsYWluZWQgaGVyZSkgIApiKSBUaGUgcmVsaWFiaWxpdHkgb2YgdGhlIG1lYXN1cmVzIHNob3VsZCBiZSAxIChyZWFzb25hYmxlIGN1dG9mZiBpcyAwLjcpLiBUaGlzIGlzIG5vdCBjb3ZlcmVkIGhlcmUuCgoKJCQKJCQKICAKCiMjIyMgMS4gTGluZWFyaXR5CiMjIyMjIyBCaXZhcmlhdGUgcGxvdHMKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoeCA9IHBoeWhlYWwgLCB5ID0gdGltZWRycykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9ICdyZWQnKSwgbWV0aG9kID0gJ2xtJywgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChhZXMoY29sID0gJ3NreWJsdWUnKSkKCmdncGxvdChkYXRhLCBhZXMoeCA9IG1lbmhlYWwgLCB5ID0gdGltZWRycykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9ICdyZWQnKSwgbWV0aG9kID0gJ2xtJywgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChhZXMoY29sID0gJ3NreWJsdWUnKSkKCmdncGxvdChkYXRhLCBhZXMoeCA9IHN0cmVzcyAsIHkgPSB0aW1lZHJzKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChhZXMoY29sID0gJ3JlZCcpLCBtZXRob2QgPSAnbG0nLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKGFlcyhjb2wgPSAnc2t5Ymx1ZScpKQpgYGAKCiAgCiQkCiQkCgoKCgoKIyMjIyMjIEZpdCBsaW5lYXIgbW9kZWw6CmBgYHtyfQpmaXQgPC0gbG0odGltZWRycyB+IHBoeWhlYWwgKyBtZW5oZWFsICsgc3RyZXNzLCBkYXRhKQpkYXRhJHJlc2lkdWFscyA8LSByZXNpZChmaXQpCmRhdGEkcmVzaWR1YWxzLnN0YW5kYXJkIDwtIHJzdGFuZGFyZChmaXQpCmRhdGEkcmVzaWR1YWxzLnN0dWRlbnRpemVkIDwtIHJzdHVkZW50KGZpdCkKZGF0YSRmaXR0ZWQgPC0gZml0dGVkLnZhbHVlcyhmaXQpCnN1bW1hcnkoZml0KQpgYGAKIyMjIyMjICRYX2kkIHZzIFN0YW5kYXJkaXplZCBSZXNpZHVhbApXZSBzaG91bGQgc2VlIHJhbmRvbWx5IGRpc3RyaWJ1dGVkIGRhdGFwb2ludHMgaW4gdGhlc2UgcGxvdHM6CmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHg9cGh5aGVhbCwgeT1yZXNpZHVhbHMuc3RhbmRhcmQpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjQpICsKICBnZW9tX3Ntb290aCgpCgpnZ3Bsb3QoZGF0YSwgYWVzKHg9c3RyZXNzLCB5PXJlc2lkdWFscy5zdGFuZGFyZCkpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNCkgKwogIGdlb21fc21vb3RoKCkKCmdncGxvdChkYXRhLCBhZXMoeD1tZW5oZWFsLCB5PXJlc2lkdWFscy5zdGFuZGFyZCkpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNCkgKwogIGdlb21fc21vb3RoKCkKYGBgCgojIyMjIyBGaXR0ZWQgdnMgYWN0dWFsIHZhbHVlczoKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoeD1maXR0ZWQsIHk9dGltZWRycykpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNCkgKwogIGdlb21fc21vb3RoKHNlPUYsIGNvbG9yPSdncmVlbicpICsKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgY29sb3I9J3JlZCcpCgpnZ3Bsb3QoZGF0YSwgYWVzKHg9Zml0dGVkLCB5PXJlc2lkdWFscykpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNCkgKwogIGdlb21fc21vb3RoKHNlPUYsIGNvbG9yPSdncmVlbicpICsKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgY29sb3I9J3JlZCcpCmBgYAoKCiAgCiQkCiQkCiAgCgojIyMjIDIuIE5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJlc2lkdWFscywgTGluZWFyaXR5IG9mIHJlc2lkdWFscyBhbmQgSG9tb3NjZWRhc3RpY2l0eQpXZSBjaGVjayB0aGVzZSBhc3N1bXB0aW9ucyBieSBpbnNwZWN0aW5nIDMgZ3JhcGhzLgoKKiBUaGlzIGhpc3RvZ3JhbSBvZiB0aGUgcmVzaWR1YWxzIHNob3VsZCBsb29rIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGJ1dCB3ZSBzZWUgY2xlYXIgZGV2aWF0aW9uIGhlcmU6CmBgYHtyfQpkYXRhJGZpdHRlZCA8LSBmaXQkZml0dGVkLnZhbHVlcwpwLmhzMyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSByZXNpZHVhbHMuc3RhbmRhcmQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG9yID0gJ2JsYWNrJywgZmlsbCA9ICd3aGl0ZScpICsKICBsYWJzKHggPSAnU3RhbmRhcmRpemVkIFJlc2lkdWFscycsIHkgPSAnRGVuc2l0eScpICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gbWVhbihkYXRhJHJlc2lkdWFscy5zdGFuZGFyZCksIHNkID0gc2QoZGF0YSRyZXNpZHVhbHMuc3RhbmRhcmQpKSwgY29sb3IgPSAncmVkJywgc2l6ZSA9IDEpCnAuaHMzCmBgYAoKCiogQWdhaW4gdGhpcyBncmFwaCBzaG91bGQgaW5kaWNhdGUgbm9ybWFsbHkgZGl0cmlidXRlZCByZXNpZHVhbHMgYnV0IHRoZXJlIGlzIGNsZWFyIGRldmlhdGlvbjoKYGBge3J9CnAuaHMyIDwtIGdncGxvdChkYXRhLCBhZXMoc2FtcGxlID0gcmVzaWR1YWxzLnN0YW5kYXJkKSkgKwogIHN0YXRfcXEoKQpwLmhzMgpgYGAKCgoKICogVGhpcyBncmFwaCBzaG91bGQgbG9vayBhcyBpZiBkb3RzIGFyZSB0b3RhbGx5IHJhbmRvbWx5IGRpc3RyaWJ1dGVkIGJ1dCBpdCBsb29rcyBsaWtlIHRoZXJlIGlzIHNvbWUgaGV0ZXJvc2NlZGFzdGljaXR5IGFzIHRoZSBkb3RzIGFyZSB2ZXJ5IGNvbmNlbnRyYXRlZCBuZWFyIHRoZSBmaXR0ZWQgbGluZSBpbiB0aGUgbGVmdCBhbmQgdGhlbiB0aGV5IHNwcmVhZCBsZWFkaW5nIHRvIHRoZSB0eXBpY2FsIF9mdW5uZWwtbG9va18gKHR5cGljYWwgZm9yIGhldGVyb3NjZWRhc3RpY2l0eSk6CmBgYHtyfQpwLmhzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGZpdHRlZCwgeT0gcmVzaWR1YWxzLnN0YW5kYXJkKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQsIGNvbG9yID0gJ3JlZCcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdibGFjaycpICsKICBnZW9tX3Ntb290aChjb2xvciA9ICd5ZWxsb3cnLCBzZSA9IEYpICsKICBsYWJzKHggPSAnRml0dGVkIFZhbHVlcycsIHkgPSAnU3RhbmRhcmRpemVkIFJlc2lkdWFsJykKcC5ocwoKYGBgCgoKICAKJCQKJCQKICAKCiMjIyMgMy4gSW5kZXBlbmRlY2Ugb2YgRXJyb3JzCkNvbnNlcnZhdGl2ZSBydWxlIGZvciB0aGUgRFdULXRlc3Q6ClZhbHVlcyBzaG91ZCBiZSBiZXR3ZWVuID4xIGFuZCA8MyBhbmQgdGhlIGNsb3NlciB0byAyLCB0aGUgYmV0dGVyLgpgYGB7cn0KZHVyYmluV2F0c29uVGVzdChmaXQpCmBgYAoKICAKJCQKJCQKICAKCiMjIyMgNC4gTXVsdGljb2xsaW5lYXJpdHkKKiBJZiB0aGUgbGFyZ2VzdCBWSUYgaXMgZ3JlYXRlciB0aGFuIDEwIHRoZW4gdGhlcmUgaXMgY2F1c2UgZm9yIGNvbmNlcm4gKEJvd2VybWFuICYgT+KAmUNvbm5lbGwsIDE5OTA7IE15ZXJzLCAxOTkwKS4KKiBJZiB0aGUgYXZlcmFnZSBWSUYgaXMgc3Vic3RhbnRpYWxseSBncmVhdGVyIHRoYW4gMSB0aGVuIHRoZSByZWdyZXNzaW9uIG1heSBiZSBiaWFzZWQgKEJvd2VybWFuICYgT+KAmUNvbm5lbGwsIDE5OTApLgoqIFRvbGVyYW5jZSBiZWxvdyAwLjEgaW5kaWNhdGVzIGEgc2VyaW91cyBwcm9ibGVtLgoqIFRvbGVyYW5jZSBiZWxvdyAwLjIgaW5kaWNhdGVzIGEgcG90ZW50aWFsIHByb2JsZW0gKE1lbmFyZCwgMTk5NSkuCmBgYHtyfQp2aWYoZml0KQoxL3ZpZihmaXQpCm1lYW4odmlmKGZpdCkpCmBgYAoKICAKJCQKJCQKICAKCiMjIyMgNi4gTXVsdGl2YXJpYXRlIE91dGxpZXJzCkhlcmUgd2Ugc2VlIHRoZSBzdGFuZGFyZGl6ZWQgb3Igc3R1ZGVudGl6ZWQgcmVzaWR1YWxzIHBsb3R0ZWQgYWdhaW5zdCB0aGUgbGV2ZXJhZ2UuIDE0IGRhdGEgcG9pbnRzIGFyZSBtdWx0aXZhcmlhdGUgb3V0bGllcnMuIDMgb2YgdGhlbSBoYXZlIGFsc28gbW9yZSB0aGFuIDJ4IHRoZSBhdmVyYWdlIGxldmVyYWdlLiBUaGVyZSBpcyBvbmUgcG9pbnQgdGhhdCBoYXMgcmVsYXRpdmVseSBoaWdoIGxldmVyYWdlIGFuZCBoaWdoIGRldmlhdGlvbiwgd2hpY2ggcG90ZW50aWFsbHkgaGFzIGEgaGlnaCBpbmZsdWVuY2Ugb24gb3VyIG1vZGVsLiBHZW5lcmFsbHksIDMuNyUgYXJlIG1vcmUgdGhhbiAyLjVTRCBhd2F5LCB3aGljaCBpbmRpY2F0ZXMgYSBwb29yIGZpdCBvZiB0aGUgbW9kZWwuCmBgYHtyfQptZWFuKGRhdGEkcmVzaWR1YWxzLnN0YW5kYXJkID4gMiB8IGRhdGEkcmVzaWR1YWxzLnN0YW5kYXJkIDwgLTIpICMgYXJlIDk1JSB3aXRoaW4gKy8tIDI/Cm1lYW4oZGF0YSRyZXNpZHVhbHMuc3RhbmRhcmQgPiAyLjUgfCBkYXRhJHJlc2lkdWFscy5zdGFuZGFyZCA8IC0yLjUpICMgYXJlIDk5JSB3aXRoaW4gKy8tIDIuNT8KCmRhdGEkY29va3MuZGlzdGFuY2UgPC0gY29va3MuZGlzdGFuY2UoZml0KQpkYXRhJGxldmVyYWdlIDwtIGhhdHZhbHVlcyhmaXQpCmluZmx1ZW5jZSA8LSBkYXRhWyhkYXRhJGNvb2tzLmRpc3RhbmNlPjAuMDUgJiBkYXRhJGxldmVyYWdlID4gMiptZWFuKGRhdGEkbGV2ZXJhZ2UpKSxdCnAubyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsZXZlcmFnZSwgeSA9IHJlc2lkdWFscy5zdGFuZGFyZCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAzLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLGFscGhhPTAuNCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGFscGhhPTAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIqIG1lYW4oZGF0YSRsZXZlcmFnZSksIGxpbmV0eXBlID0gJ2RvdHRlZCcsYWxwaGE9MC40KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGluZmx1ZW5jZSwgYWVzKHggPSBsZXZlcmFnZSwgeSA9IHJlc2lkdWFscy5zdGFuZGFyZCksIGNvbG9yID0gJ3JlZCcpICsKICBnZW9tX3RleHQoZGF0YSA9IGluZmx1ZW5jZSwgYWVzKGxhYmVsID1ybiksIHZqdXN0ID0gMikKCnAuby5yc3QgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbGV2ZXJhZ2UsIHkgPSByZXNpZHVhbHMuc3R1ZGVudGl6ZWQpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMywgbGluZXR5cGUgPSAnZG90dGVkJyxhbHBoYT0wLjQpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBhbHBoYT0wLjQpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyKiBtZWFuKGRhdGEkbGV2ZXJhZ2UpLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLGFscGhhPTAuNCkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBpbmZsdWVuY2UsIGFlcyh4ID0gbGV2ZXJhZ2UsIHkgPSByZXNpZHVhbHMuc3R1ZGVudGl6ZWQpLCBjb2xvciA9ICdyZWQnKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBpbmZsdWVuY2UsIGFlcyhsYWJlbCA9cm4pLCB2anVzdCA9IDIpCgpwLm8KcC5vLnJzdApgYGAKCgoKICAKJCQKJCQKICAKCiMjIyMgSG93IHRvIG1ha2UgYSBxdWljayBhbmFseXNpczoKYGBge3J9CnBsb3QoZml0KQpgYGAKCmBgYHtyfQpndmxtYShmaXQpCmBgYAoKTG9nIHRyYW5zZm9ybSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlOgpgYGB7cn0KZGF0YSR0aW1lZHJzLmxvZyA8LSBsb2coKGRhdGEkdGltZWRycysxKSkKYGBgCgoxLiBOb3JtYWxpdHkKVGhlIGRldmlhdGlvbiBmcm9tIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIChvZiB0aGUgRFYpIGhhcyBzb21ld2hhdCBpbXByb3ZlZDoKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoeD10aW1lZHJzLmxvZykpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sID0gJ2JsYWNrJywgZmlsbCA9ICd3aGl0ZScpICsgCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgY29sb3IgPSAncmVkJywgYXJncyA9IGxpc3QobWVhbihkYXRhJHRpbWVkcnMubG9nKSwgc2QgPSBzZChkYXRhJHRpbWVkcnMubG9nKSksIHNpemUgPSAxKQoKZ2dwbG90KGRhdGEsIGFlcyhzYW1wbGUgPSB0aW1lZHJzLmxvZykpICsgCiAgc3RhdF9xcSgpCmBgYAoKCkJ1dCBhY2NvcmRpbmcgdG8gdGhlIFNoYXBpcm8tV2lsayB0ZXN0LCB0aGUgcGVyY2VudGFnZSBvbiB0aGUgbG9ndHJhbnNmb3JtZWQgdmFyaWFibGUgX3RpbWVkcnNfLCBXID0gMC42MzcsIHAgPCAuMDAxLCBpcyBzdGlsbCBzaWduaWZpY2FudGx5IG5vbi1ub3JtYWwuCmBgYHtyfQpzaGFwaXJvLnRlc3QoZGF0YSR0aW1lZHJzLmxvZykKYGBgCgoyLiBMaW5lYXJpdHkKSXQgbG9va3MgYXMgaWYgdGhlIHJlYXRpb25zaGlwIGlzIHJvdWdobHkgbGluZWFyOgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gcGh5aGVhbCAsIHkgPSB0aW1lZHJzLmxvZykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgoY29sID0gJ3JlZCcsIG1ldGhvZCA9ICdsbScsIGFscGhhID0gMC40LCBzZSA9IEYpICsKICBnZW9tX3Ntb290aChjb2wgPSAnc2t5Ymx1ZScpCgpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBtZW5oZWFsICwgeSA9IHRpbWVkcnMubG9nKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChjb2wgPSAncmVkJywgbWV0aG9kID0gJ2xtJywgYWxwaGEgPSAwLjQsIHNlID0gRikgKwogIGdlb21fc21vb3RoKGNvbCA9ICdza3libHVlJykKCmdncGxvdChkYXRhLCBhZXMoeCA9IHN0cmVzcyAsIHkgPSB0aW1lZHJzLmxvZykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgoY29sID0gJ3JlZCcsIG1ldGhvZCA9ICdsbScsIGFscGhhID0gMC40KSArCiAgZ2VvbV9zbW9vdGgoY29sID0gJ3NreWJsdWUnKQpgYGAKCgozLiBNdWx0aXZhcmlhdGUgT3V0bGllcnMKVGhlIHBlcmNlbnRhZ2Ugb2Ygb3V0bGllcnMgaW5kaWNhdGVzIHRoYXQgb3VyIG1vZGVsIGZpdCBpcyBub3Qgc3VmZmljaWVudC4KYGBge3J9CmRhdGEkbG9nLmxldmVyYWdlIDwtIGhhdHZhbHVlcyhmaXQubG9nKQpkYXRhJGxvZy5yZXNpZHVhbHMuc3RhbmRhcmQgPC0gcnN0YW5kYXJkKGZpdC5sb2cpCmRhdGEkbG9nLnJlc2lkdWFscyA8LSByZXNpZChmaXQubG9nKQpkYXRhJGxvZy5jb29rcy5kaXN0YW5jZSA8LSBjb29rcy5kaXN0YW5jZShmaXQubG9nKQpkYXRhJGxvZy5yZXNpZHVhbHMuc3R1ZGVudGl6ZWQgPC0gcnN0dWRlbnQoZml0LmxvZykKbWVhbihkYXRhJGxvZy5yZXNpZHVhbHMuc3RhbmRhcmQgPiAyIHwgZGF0YSRsb2cucmVzaWR1YWxzLnN0YW5kYXJkIDwgLTIpICMgYXJlIDk1JSB3aXRoaW4gKy8tIDI/Cm1lYW4oZGF0YSRsb2cucmVzaWR1YWxzLnN0YW5kYXJkID4gMi41IHwgZGF0YSRsb2cucmVzaWR1YWxzLnN0YW5kYXJkIDwgLTIuNSkgIyBhcmUgOTklIHdpdGhpbiArLy0gMi41PwpgYGAKVGhlcmUgcmVtYWlucyBvbmUgbXVsdGl2YXJpYXRlIG91dGxpZXIgd2l0aCBsb3cgbGV2ZXJhZ2UuIFRoZSBtb3N0IGluZmx1ZW50YWwgZGF0YSBwb2ludCBhY2NvcmRpbmcgdG8gQ29vaydzIEQgaGFzIGEgQ29vaydzIEQgbG93ZXIgdGhhbiAwLjA4IGFuZCBpcyB0aGVyZWZvcmUgbm90IGNvbnNpZGVyZWQgcHJvYmxlbXRhdGljLgpgYGB7cn0KZmFyYSA8LSBkYXRhW2RhdGEkbG9nLnJlc2lkdWFscy5zdGFuZGFyZD49MyxdCmxvZy5pbmZsdWVuY2UgPC0gZGF0YVsoZGF0YSRsb2cuY29va3MuZGlzdGFuY2U+MC4wNyAmIGRhdGEkbG9nLmxldmVyYWdlID4gMiptZWFuKGRhdGEkbG9nLmxldmVyYWdlKSksXQoKcC5sb2cubyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb2cubGV2ZXJhZ2UsIHkgPSBsb2cucmVzaWR1YWxzLnN0dWRlbnRpemVkKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDMsIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyLCBsaW5ldHlwZSA9ICdkb3R0ZWQnKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIsIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyKiBtZWFuKGRhdGEkbGV2ZXJhZ2UpLCBsaW5ldHlwZSA9ICdkb3R0ZWQnKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGxvZy5pbmZsdWVuY2UsIGFlcyh4ID0gbG9nLmxldmVyYWdlLCB5ID0gbG9nLnJlc2lkdWFscy5zdHVkZW50aXplZCksIGNvbG9yID0gJ3JlZCcpICsKICBnZW9tX3RleHQoZGF0YSA9IGxvZy5pbmZsdWVuY2UsIGFlcyhsYWJlbCA9cm4pLCB2anVzdCA9IDIpKwogIGdlb21fdGV4dChkYXRhID0gZmFyYSwgYWVzKGxhYmVsID1ybiksIGhqdXN0ID0gMS4yKQpwLmxvZy5vCgpgYGAKCjQuIEluZGVwZW5kZWNlIG9mIEVycm9ycwpDb25zZXJ2YXRpdmUgcnVsZToKVmFsdWVzIHNob3VkIGJlID4xIGFuZCA8MyBhbmQgdGhlIGNsb3NlciB0byAyLCB0aGUgYmV0dGVyLgpgYGB7cn0KZHVyYmluV2F0c29uVGVzdChmaXQubG9nKQpgYGAKCgo1LiBNdWx0aWNvbGxpbmVhcml0eQoqIElmIHRoZSBsYXJnZXN0IFZJRiBpcyBncmVhdGVyIHRoYW4gMTAgdGhlbiB0aGVyZSBpcyBjYXVzZSBmb3IgY29uY2VybiAoQm93ZXJtYW4gJiBP4oCZQ29ubmVsbCwgMTk5MDsgTXllcnMsIDE5OTApLgoqIElmIHRoZSBhdmVyYWdlIFZJRiBpcyBzdWJzdGFudGlhbGx5IGdyZWF0ZXIgdGhhbiAxIHRoZW4gdGhlIHJlZ3Jlc3Npb24gbWF5IGJlIGJpYXNlZCAoQm93ZXJtYW4gJiBP4oCZQ29ubmVsbCwgMTk5MCkuCiogVG9sZXJhbmNlIGJlbG93IDAuMSBpbmRpY2F0ZXMgYSBzZXJpb3VzIHByb2JsZW0uCiogVG9sZXJhbmNlIGJlbG93IDAuMiBpbmRpY2F0ZXMgYSBwb3RlbnRpYWwgcHJvYmxlbSAoTWVuYXJkLCAxOTk1KS4gCmBgYHtyfQp2aWYoZml0LmxvZykKMS92aWYoZml0LmxvZykKbWVhbih2aWYoZml0LmxvZykpCmBgYAoKNi4gSG9tb3NjZWRhc3RpY2l0eSwgTm9ybWFsbHkgZGlzdHJpYnV0ZWQgcmVzaWR1YWxzIGFuZCBMaW5lYXJpdHkKV2UgY2hlY2sgdGhpcyBhc3N1bXB0aW9ucyBhZ2FpbiBieSBpbnNwZWN0aW5nIDMgZ3JhcGhzLgoKKiBUaGlzIGhpc3RvZ3JhbSBvZiBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIHNob3VsZCBsb29rIGxpa2UgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFuZCBpdCBpcyBkZWZpbml0aXZlbHkgaW1wcm92ZWQgYW5kIGxvb2tzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkOgpgYGB7cn0KZGF0YSRsb2cuZml0dGVkIDwtIGZpdC5sb2ckZml0dGVkLnZhbHVlcwoKcC5sb2cuaHMzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvZy5yZXNpZHVhbHMuc3RhbmRhcmQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG9yID0gJ2JsYWNrJywgZmlsbCA9ICd3aGl0ZScpICsKICBsYWJzKHggPSAnTG9nIFN0YW5kYXJkaXplZCBSZXNpZHVhbCcsIHkgPSAnRGVuc2l0eScpICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gbWVhbihkYXRhJGxvZy5yZXNpZHVhbHMuc3R1ZGVudGl6ZWQpLCBzZCA9IHNkKGRhdGEkbG9nLnJlc2lkdWFscy5zdHVkZW50aXplZCkpLCBjb2xvciA9ICdyZWQnLCBzaXplID0gMSkKcC5sb2cuaHMzCmBgYAoKICogQWdhaW4gdGhpcyBncmFwaCBzaG91bGQgaW5kaWNhdGUgbm9ybWFsbHkgZGl0cmlidXRlZCByZXNpZHVhbHMsIHdoaWNoIGl0IGRvZXM6CmBgYHtyfQpwLmxvZy5oczIgPC0gZ2dwbG90KGRhdGEsIGFlcyhzYW1wbGUgPSBsb2cucmVzaWR1YWxzLnN0YW5kYXJkKSkgKwogIHN0YXRfcXEoKQpwLmxvZy5oczIKYGBgCiAqIFRoaXMgZ3JhcGggc2hvdWxkIGxvb2sgYXMgaWYgZG90cyBhcmUgbm9ybWFsbHkgcmFuZG9tbHkgZGlzdHJpYnV0ZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGxpbmUuIFRoZSBMT0VTUyBmaXQgc2hvdWxkIG5vdCBzaG93IGEgc3Ryb25nIGN1cnZlLiBUaGUgcGxvdCBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzIGNsZWFybHkgaW1wb3J2ZWQgd2l0aCByZWdhcmQgdG8gb3VyIGFzc3VtcHRpb25zLgogCmBgYHtyfQpwLmxvZy5ocyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBmaXR0ZWQsIHk9IGxvZy5yZXNpZHVhbHMuc3RhbmRhcmQpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNCwgY29sb3IgPSAncmVkJykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGNvbG9yID0gJ2JsYWNrJykgKwogIGdlb21fc21vb3RoKGNvbG9yID0gJ3llbGxvdycsIHNlID0gRikgKwogIGxhYnMoeCA9ICdGaXR0ZWQgVmFsdWVzJywgeSA9ICdMb2cgU3RhbmRhcmRpemVkIFJlc2lkdWFsJykKcC5sb2cuaHMKYGBgCgoKCiMjIyMjIyBQZXJmb3JtIHJlZ3Jlc3Npb24gYW5hbHlzaXMgZm9yIG9wdGlvbmFsIHF1ZXN0aW9uOgpgYGB7cn0KZGF0YSRzc3RyZXNzIDwtIHNxcnQoZGF0YSRzdHJlc3MpCmRhdGEkbHBoeWhlYWwgPC0gbG9nKGRhdGEkcGh5aGVhbCkKZGF0YSRzbWVuaGVhbCA8LSBzcXJ0KGRhdGEkbWVuaGVhbCkKCmZpdC50cmFucyA8LSBsbSh0aW1lZHJzLmxvZyB+IGxwaHloZWFsICsgc21lbmhlYWwgKyBzc3RyZXNzLCBkYXRhKQpkYXRhJHRsZXZlcmFnZSA8LSBoYXR2YWx1ZXMoZml0LnRyYW5zKQpkYXRhJHRjb29rIDwtIGNvb2tzLmRpc3RhbmNlKGZpdC50cmFucykKZGF0YSR0c3RyZXNpZCA8LSByc3RhbmRhcmQoZml0LnRyYW5zKQpkYXRhJHRmaXR0ZWQgPC0gZml0LnRyYW5zJGZpdHRlZC52YWx1ZXMKCnRpbmZsdWVuY2UgPC0gZGF0YVsoZGF0YSR0Y29vayA+MC4wNSAmIGRhdGEkdGxldmVyYWdlID4gMiptZWFuKGRhdGEkdGxldmVyYWdlKSksXQp0ZmFyYSA8LSBkYXRhW2RhdGEkdHN0cmVzaWQ+PTMsXQoKcC50cmFucyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSB0Zml0dGVkLCB5PSB0c3RyZXNpZCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40LCBjb2xvciA9ICdyZWQnKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnYmxhY2snKSArCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSAneWVsbG93Jywgc2UgPSBGKSArCiAgbGFicyh4ID0gJ0ZpdHRlZCBWYWx1ZXMnLCB5ID0gJ1RyYW5zZm9ybWVkIC0gU3RhbmRhcmRpemVkIFJlc2lkdWFsJykKCnAudHJhbnMudHdvIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IHRsZXZlcmFnZSwgeSA9IHRzdHJlc2lkKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDMsIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyLCBsaW5ldHlwZSA9ICdkb3R0ZWQnKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIsIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyKiBtZWFuKGRhdGEkdGxldmVyYWdlKSwgbGluZXR5cGUgPSAnZG90dGVkJykgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsKICBnZW9tX3BvaW50KGRhdGEgPSB0aW5mbHVlbmNlLCBhZXMoeCA9IHRsZXZlcmFnZSwgeSA9IHRzdHJlc2lkKSwgY29sb3IgPSAncmVkJykgKwogIGdlb21fdGV4dChkYXRhID0gdGluZmx1ZW5jZSwgYWVzKGxhYmVsID1ybiksIHZqdXN0ID0gMikrCiAgZ2VvbV90ZXh0KGRhdGEgPSB0ZmFyYSwgYWVzKGxhYmVsID0gcm4pLCBoanVzdCA9IDEuMikKCiNJbmRlcGVuZGVuY2Ugb2YgRXJyb3IKZHVyYmluV2F0c29uVGVzdChmaXQudHJhbnMpCgojTXVsdGljb2xsaW5lYXJpdHkKdmlmKGZpdC50cmFucykKMS92aWYoZml0LnRyYW5zKQptZWFuKHZpZihmaXQudHJhbnMpKQoKIyBPdXRsaWVyCm1lYW4oZGF0YSR0c3RyZXNpZCA+IDIgfCBkYXRhJHRzdHJlc2lkIDwgLTIpICMgYXJlIDk1JSB3aXRoaW4gKy8tIDI/Cm1lYW4oZGF0YSR0c3RyZXNpZCA+IDIuNSB8IGRhdGEkdHN0cmVzaWQgPCAtMi41KSAjIGFyZSA5OSUgd2l0aGluICsvLSAyLjU/CgpwLnRyYW5zCnAudHJhbnMudHdvCgpgYGAKCgokXG5ld3BhZ2UkCgoKCgojIEhvbWV3b3JrCgojIyBQYXJ0IEEKKioxLiBEb2VzIHRoZSBhbmFseXNpcyB2aW9sYXRlIGFueSBzdGF0aXN0aWNhbCBhc3N1bXB0aW9ucz8gV2h5IG9yIHdoeSBub3Q/KioKClRoZSBzdHVkZW50aXplZCBhbmQgc3RhbmRhcmRpemVkIHJlc2lkdWFscyBsb29rIG5vdCBldmVubHkgYW5kIHN5bW1ldHJpY2FsbHkgZGlzdHJpYnV0ZWQuCmBgYHtyfQpwLmhzMwpgYGAKVGhlIFFRLXBsb3QgY29uZmlybXMgYSBjbGVhciBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkgb2YgdGhlIHN0YW5kYXJkaXplZCByZXNpZHVhbHMsIHRodXMgdmlvbGF0aW5nIHRoZSBhc3N1bXB0aW9uIG9mIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJlc2lkdWFscy4KYGBge3J9CnAuaHMyCmBgYApGaW5hbGx5LCB0aGUgZml0dGVkIHZhbHVlcyBwbG90dGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkaXplZCByZXNpZHVhbHMgc2hvdWxkIHNob3cgcmFuZG9tbHkgbm9ybWFsIGRpc3RyaWJ1dGVkIGRvdHMgYXJvdW5kIHRoZSBob3Jpem9udGFsIGxpbmUuIEJ1dCBpbiB0aGUgcGxvdCBtYW55IGRvdHMgYXJlIGNvbmNlbnRyYXRlZCBvbiB0aGUgbGVmdCBuZWFyIHRoZSBsaW5lLCBhcmUgbm90IHN5bW1ldHJpYyBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpbmNyZWFzZXMgYWNyb3NzIHRoZSB4LWF4aXMgY2xlYXJseSBpbmRpY2F0aW5nIGhldGVyb3NjZWRhc3RpY2l0eS4gVGh1cywgdGhlIGFzc3VtcHRpb24gb2YgSG9tb3NjZWRhc3RpY2l0eSBpcyB2aW9sYXRlZCwgdG9vLgpgYGB7cn0KcC5ocwpgYGAKCgoqKjIuIERvZXMgdGhpcyBhbmFseXNpcyB2aW9sYXRlIGFueSBzdGF0aXN0aWNhbCBhc3N1bXB0aW9ucz8qKiAgClRoZXJlIGFyZSBubyB2aW9sYXRpb25zIGFueW1vcmUuCgoqKjMuIERvIHRoZSByZXNpZHVhbHMgbG9vayBub3JtYWwsIGxpbmVhciwgYW5kIGhvbW9zY2VkYXN0aWM/IFdoeSBvciB3aHkgbm90PyBUaGF0IGlzLCBkZXNjcmliZSB3aGF0IGZlYXR1cmVzIG9mIHRoZSBzY2F0dGVycGxvdCBiZXR3ZWVuIHRoZSBwcmVkaWN0ZWQgYW5kIHJlc2lkdWFsIHZhbHVlcyBpbmRpY2F0ZSBlYWNoIGFzc3VtcHRpb24gaXMgZWl0aGVyIG1ldCBvciB2aW9sYXRlZC4qKiAgClRoZSByZXNpZHVhbHMgbG9vayBub3JtYWwgYmVjYXVzZSB0aGUgUVEtUGxvdCBzaG93cyBhIGxpbmUgd2l0aCBubyBtYWpvciBkZXZpYXRpb25zIGFuZCB0aGUgZGlzdHJpYnV0aW9uIHNob3duIGJ5IHRoZSBoaXN0b2dyYW0gYWxzbyBsb29rcyBub3JtYWwuCmBgYHtyfQpwLmxvZy5oczMKcC5sb2cuaHMyCmBgYApUaGUgcmVzaWR1YWxzIGFsc28gbG9vayBzeW1tZXRyaWNhbGx5IGRpc3RyaWJ1dGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBsaW5lIChpbmRpY2F0aW5nIG5vcm1hbCBkaXN0cmlidXRpb24pLiBWaW9sYXRpbmcgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3b3VsZCBtZWFuIHRoZSBkb3RzIGJlaW5nIG5vbi1zeW1tZXRyaWNhbGx5IGRpc3RyaWJ1dGVkIG9yIHRoZSBkb3RzIGJlaW5nIG1vcmUgY29uY2V0cmF0ZWQgZnVydGhlciBhd2F5IGZyb20gdGhlIGhvcml6b250YWwgbGluZS4gVGhlcmUgaXMgb25seSBhIG1pbGQgY3VydmVybGluZWFyIHRyZW5kLCB0aHVzIHRoZSBhc3N1bXB0aW9uIG9mIGxpbmVhcml0eSBpcyBub3QgdmlvbGF0ZWQuICBUaGUgZGF0YXBvaW50cyBhcmUgcmVsYXRpdmVseSBldmVubHkgYW5kIHJhbmRvbWx5IHNwcmVhZCBpbmRpY2F0aW5nIGhvbW9zY2VkYXN0aWNpdHkuIEhldGVyb3NjZWRhc3RpY2l0eSB3b3VsZCBiZSBvYnZpb3VzIGJ5IGFuIGluY3JlYXNpbmcgc3RhbmRhcmQgZGV2aWF0aW9uIGFjcm9zcyB0aGUgeC1heGlzIGxlYWRpbmcgdG8gdGhlIHR5cGljYWwgJ2Z1bm5lbCBsb29rJy4KCmBgYHtyfQpwLmxvZy5ocwpgYGAKCgoKKio0LiBIb3cgbWFueSBtdWx0aXZhcmlhdGUgb3V0bGllcnMgYXJlIHRoZXJlPyoqICAKVGhlcmUgaXMgb25lIG91dGxpZXIgKGlkIDQ3OSwgcm93bnVtYmVyIDM0NSkgaWYgdGhlIGNyaXRlcml1bSBpcyArLy0gMyBTRCBvZiB0aGUgcmVzaWR1YWxzLiBCdXQgaXQgaGFzIG5vdCBhcyBtdWNoIGluZmx1ZW5jZSBhcyB0aGUgb2JzZXJ2YXRpb24gd2l0aCBpZCBfNDA1XyBhY2NvcmRpbmcgdG8gdGhlIENvb2sncyBkaXN0YW5jZS4gQnV0IHRoaXMgb2JzZXJ2YXRpb24gc3RpbGwgaGFzIG5vIGNyaXRpY2FsIHZhbHVlLiBIb3dldmVyLCA2LjQ1JS8yLjYlIG9mIHRoZSBkYXRhIGFyZSBtb3JlIHRoYW4gMiBTRC8yLjUgU0Qgc3ByZWFkIGF3YXkgZnJvbXQgdGhlIG1lYW4gaW5kaWNhdGluZyBhIHBvb3IgZml0LgoKYGBge3J9CnAubG9nLm8KYGBgCgoKKipPUFRJT05BTDogUGVyZm9ybSBhbm90aGVyIHJlZ3Jlc3Npb24gYW5hbHlzaXMsIGJ1dCB0aGlzIHRpbWUgdXNlIHRoZSB0cmFuc2Zvcm1lZCBtZWFzdXJlcyBvZiBhbGwgdmFyaWFibGVzLiBEb2VzIHRoZSBpbmNsdXNpb24gb2YgdHJhbnNmb3JtZWQgcHJlZGljdG9ycyBmdXJ0aGVyIHJlZHVjZSB2aW9sYXRpb25zIG9mIG1vZGVsIGFzc3VtcHRpb25zPyoqCgpUaGVyZSByZW1haW5zIG9uZSBtdWx0aXZhcmlhdGUgb3V0bGllciAoMzQ1KSwgd2hpY2ggc3RpbGwgaGFzIG5vdCB0aGUgaGlnaGVzdCBpbmZsdWVuY2UgKGFuZCBubyBvdGhlciBvYnNlcnZhdGlvbnMgaGF2ZSB0b28gaGlnaCBpbmZsdWVuY2UpLiBCdXQgdGhlIHBlcmNlbnRhZ2Ugb2Ygc3RhbmRhcmRpemVkIHJlc2lkdWFscyA+ICsvLTIgaW5jcmVhc2VkIHRvIH43JSBpbmRpY2F0aW5nIGEgcG9vciBmaXQgb2YgdGhlIGxpbmVhciBtb2RlbC4gQXNzdW1wdGlvbnMgb2YgTm9ybWFsaXR5LCBMaW5lYXJpdHkgYW5kIEhvbW9zY2VkYXN0aWNpdHkgYXJlIG5vdCB2aW9sYXRlZC4gU2VlIHBsb3RzIGZvciB2aXN1YWwgc3VtbWFyeToKYGBge3J9CnAudHJhbnMKcC50cmFucy50d28KYGBgCgoKCgojIyBQYXJ0IEI6IFBlcmZvcm0gYW5hbHlzZXMgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cyAKClVzZSB0aGUgcmVzdWx0cyBvZiB0aGUgcmVncmVzc2lvbiB0aGF0IGluY2x1ZGVkIHRoZSB0cmFuc2Zvcm1lZCBzY29yZSBvZiBUSU1FRFJTIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczoKCioqNS4gV2hhdCBpcyB0aGUgYmVzdCBwcmVkaWN0b3Igb2YgVElNRURSUyAoaS5lLiwgbGFyZ2VzdCBiZXRhKT8gICoqICAKCkFzIHNlZW4gaW4gdGhlIG91dHB1dDogUEhZSEVBTCBpcyB0aGUgYmVzdCBwcmVkaWN0b3IuCmBgYHtyfQpmaXQubG9nLmJldGEgPC0gbG0uYmV0YShmaXQubG9nKQpzdW1tYXJ5KGZpdC5sb2cuYmV0YSkKYGBgCgoKKio2LiBIb3cgbXVjaCBvZiB0aGUgdmFyaWFuY2Ugb2YgVElNRURSUyBpcyBleHBsYWluZWQgYnkgdGhlIHRocmVlIHByZWRpY3RvcnM/ICAqKgoKJFJeMiA9IDAuMzY4MiQKCioqNy4gQ29tcGxldGUgdGhlIHRhYmxlIGJlbG93LiBCZSBzdXJlIHRvIGluY2x1ZGUgYWxsIHZhbHVlcyBpbiB0aGUgdGFibGUgYW5kIGluIHRoZSB0YWJsZSBub3RlIChpLmUuLCB0aGUgbiBhbmQgUjIpLioqICAKCgp8ICAgfCAgICAgIGIgICAgICB8ICBTRSB8ICAkXGJldGEkIHwgcC12YWx1ZSAgfAp8LS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS18Oi0tLS0tLXw6LS0tLS18LS0tLS18CnwgU3RyZXNzZnVsIGxpZmUgZXZlbnRzIHwgMC4wMDEgIHwwLjAwMDIgfCAgMC4xODcgfCA8IDAuMDAxIHwKfCBNZW50YWwgaGVhbHRoIHByb2JsZW1zfCAgMC4wMDcgICB8IDAuMDEwMSB8ICAwLjAzMSB8IDwgMC40ODEgIHwKfCBQaHlzaWNhbCBoZWFsdGggcHJvYmxlbXMgfDAuMjAyIHwgMC4wMTcgICB8ICAwLjUwNCB8IDwgMC4wMDEgIHwKX05vdGU6IG4gPSA0NjUsIEFkanVzdGVkICRSXjIkID0gMC4zNl8gIAoKCgoKCgoKKio4LiBXaGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZXJjZXB0PyAqKiAgIAoKMC4zOTA0CgoKKio5LiBEZXNjcmliZSB0aGUgcmVzdWx0cyBvZiB0aGlzIHJlZ3Jlc3Npb24gYW5hbHlzaXMgaW4gQVBBIHN0eWxlLiBCZSBzdXJlIHRvIGRlc2NyaWJlIHRoZSBhbmFseXNpcywgdGhlIGFtb3VudCBvZiBleHBsYWluZWQgdmFyaWFuY2UsIGFuZCB0aGUgbWFnbml0dWRlIGFuZCBkaXJlY3Rpb24gb2Ygc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbnMuICAqKiAgCgoKCnwgICB8ICAgICAgQiAgICAgIHwgIFNFIEIgfCAgJFxiZXRhJCB8IFAgfAp8LS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS18Oi0tLS0tLXw6LS0tLS18LS0tLS18CnwgQ29uc3RhbnQgfCAwLjM5ICB8MC4wOSB8ICAgfCA8IDAuMDAxIHwKfCBTdHJlc3NmdWwgbGlmZSBldmVudHMgfCAkMC4wMDFeeyoqKn0kICB8PCAwLjAwMSB8ICAwLjE4NyB8IDwgMC4wMDEgfAp8IE1lbnRhbCBoZWFsdGggcHJvYmxlbXN8ICAwLjAwNyAgIHwgMC4wMSB8ICAwLjAzMSB8IDwgMC40ODEgIHwKfCBQaHlzaWNhbCBoZWFsdGggcHJvYmxlbXMgfCQwLjIwXnsqKip9JCB8IDAuMDIgICB8ICAwLjUwNCB8IDwgMC4wMDEgIHwKX05vdGU6IG4gPSA0NjUsIEFkanVzdGVkICRSXjIkID0gMC4zNl8gICAKCgoKCgojIyBQYXJ0IEM6IERpZmZlcmVuY2VzIGJldHdlZW4gdHlwZXMgb2YgcmVncmVzc2lvbiBhbmFseXNlcwoKVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGxpbmVhciAoYW5kIGxvZ2lzdGljKSByZWdyZXNzaW9uOgpTdGFuZGFyZCByZWdyZXNzaW9uICh3aGljaCBpcyBwZXJmb3JtZWQgaW4gU1BTUyBieSBkZWZhdWx0KSBjb25zaXN0cyBvZiBhbGwgcHJlZGljdG9ycyBiZWluZyBzaW11bHRhbmVvdXNseSBlbnRlcmVkIAooaS5lLiwgaW4gYSBzaW5nbGUgYmxvY2spLiAKCkhpZXJhcmNoaWNhbCByZWdyZXNzaW9uIGNvbnNpc3RzIG9mIHByZWRpY3RvcnMgYmVpbmcgZW50ZXJlZCBpbiBkaWZmZXJlbnQgYmxvY2tzIHRvIGRldGVybWluZSB0aGUgdW5pcXVlIGNvbnRyaWJ1dGlvbnMgCm9mIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCAoaS5lLiwgY2hhbmdlIGluIFItc3F1YXJlKS4gClN0YXRpc3RpY2FsIHJlZ3Jlc3Npb24gaW52b2x2ZXMgZGlmZmVyZW50IG1ldGhvZCBmb3IgZW50ZXJpbmcgYW5kIHJlbW92aW5nIHByZWRpY3RvcnMgdGhhdCBpbXByb3ZlIHRoZSBwcmVkaWN0aXZlIAp2YWx1ZSBvZiB0aGUgcmVncmVzc2lvbiBhbmFseXNpcy4gVGhhdCBpcywgU1BTUyBkZWNpZGVzIHdoaWNoIHByZWRpY3RvcnMgdG8gaW5jbHVkZSBhbmQgZXhjbHVkZSBmcm9tIHRoZSByZWdyZXNzaW9uIG1vZGVsLiBTdGF0aXN0aWNhbCByZWdyZXNzaW9uIGlzIHBlcmZvcm1lZCBqdXN0IGxpa2Ugc3RhbmRhcmQgbXVsdGlwbGUgcmVncmVzc2lvbiwgZXhjZXB0IHRoYXQgdGhlIE1FVEhPRCBpcyBkaWZmZXJlbnQuIEZvciBzdGF0aXN0aWNhbCByZWdyZXNzaW9uLCB0aGUgbWV0aG9kcyBhcmUgRk9SV0FSRCwgQkFDS1dBUkQsIGFuZCBTVEVQV0lTRSAoZm9yIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGhlIG1ldGhvZCBpcyBFTlRFUikuCgoqKjEwLiBTdGFuZGFyZCByZWdyZXNzaW9uIGhhcyBiZWVuIHVzZWQgYW5kIHJlcG9ydGVkIHRodXMgZmFyLiBEZXNjcmliZSBzaXR1YXRpb25zIHdoZW4gaGllcmFyY2hpY2FsIGFuZCBzdGF0aXN0aWNhbCByZWdyZXNzaW9uIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdGhhbiB1c2luZyBhIHN0YW5kYXJkIHJlZ3Jlc3Npb24uKiogIAoKVGhpcyBkZXBlbmRzIG9uIHRoZSByZXNlYXJjaCBxdWVzdGlvbi4gSGllcmFyY2hpY2FsIHJlZ3Jlc3Npb24gd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uOiBfRG9lcyAoZS5nLilfICRYXzEkIF9zaWduaWZpY2FudGx5IGFkZCB0byBwcmVkaWN0aW9uIG9mIFkgYWZ0ZXIgZGlmZmVyZW5jZXMgYW1vbmcgc3ViamVjdHMgaW5fICRYXzIkIF9hbmRfICRYXzMkIF9oYXZlIGJlZW4gc3RhdGlzdGljYWxseSBlbGltaW5hdGVkP18gIApTdGF0aXN0aWNhbCByZWdyZXNzaW9uIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdG8gYW5zd2VyOiBfV2hhdCBpcyB0aGUgYmVzdCBsaW5lYXIgY29tYmluYXRpb24gb2YgSVZzIHRvIHByZWRpY3QgdGhlIERWIGluIHRoaXMgc2FtcGxlP18KCmBgYHtyLCBlY2hvPUZ9CndyaXRlLnRhYmxlKGRhdGEsICdkYXRhX1IuZGF0Jywgc2VwPSdcdCcsIHJvdy5uYW1lcz1GKQpgYGAKCgoKCgo=